﻿using SIAKADCORE.Helpers;
using SIAKADCORE.Models;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SIAKADCORE.Controllers
{
    /// <summary>
    /// Kelas DetailPengambilanMatakuliahController
    /// </summary>
    public static class DetailPengambilanMatakuliahController
    {
        /// <summary>
        /// Method untuk menambahkan entri detailPengambilanMatakuliah
        /// </summary>
        /// <param name="detailPengambilanMatakuliah">Kelas DetailPengambilanMatakuliah.</param>
        /// <returns> True ketika menambahkan entri dan sebaliknya.</return>
        public static bool Tambah(DetailPengambilanMatakuliah detailPengambilanMatakuliah)
        {
            if (!VerifikasiIds(ref detailPengambilanMatakuliah)) return false;

            string queryString = string.Format("INSERT INTO {0}({1},{2},{3}) VALUES ('{4}','{5}','{6}')",
                DetailPengambilanMatakuliah.TableName,
            DetailPengambilanMatakuliah.ColumnNameIdDetailPengambilanMatakuliah,
                DetailPengambilanMatakuliah.ColumnNameIdDetailMatakuliah,
                DetailPengambilanMatakuliah.ColumnNameIdMahasiswa,
                detailPengambilanMatakuliah.IdDetailPengambilanMatakuliah,
                detailPengambilanMatakuliah.IdDetailMatakuliah,
                detailPengambilanMatakuliah.IdMahasiswa);
            return SQLHelper.Instance.ExecuteNonQuery(queryString);
        }

   /// <summary>
   /// Method untuk menghapus entri detailPengambilanMatakuliah
   /// </summary>
   /// <param name="idDetailPengambilanMatakuliah">Id detail pengambilan matakuliah yang akan dihapus.</param>
   /// <returns>True ketika sukses menghapus entri dan sebaliknya.</returns>
        public static bool Hapus(string idDetailPengambilanMatakuliah)
        {
            string queryString = string.Format("DELETE FROM {0} WHERE {1} = '{2}'",
             DetailPengambilanMatakuliah.TableName,
             DetailPengambilanMatakuliah.ColumnNameIdDetailPengambilanMatakuliah,
             DetailPengambilanMatakuliah.ColumnNameIdDetailMatakuliah, idDetailPengambilanMatakuliah);
            return SQLHelper.Instance.ExecuteNonQuery(queryString);
        }
        ///<summary>
        ///Method untuk verifikasi Ids yang dibutuhkan dalam memasukan entri baru
        ///</summary>
        ///<param name="detailPengambilanMatakuliah">Kelas DetailPengambilanMatakuliah.</param>
        ///<returns>True ketika semua Ids terdaftar pada masing-masing tabel.</return>
        private static bool VerifikasiIds(ref DetailPengambilanMatakuliah detailPengambilanMatakuliah)
        {
            bool verifikasiDetailMatakuliah = DetailMatakuliahController.IsExist(detailPengambilanMatakuliah.IdDetailMatakuliah);
            bool verifikasiMahasiswa = MahasiswaController.IsExist(detailPengambilanMatakuliah.IdMahasiswa);

            return (verifikasiDetailMatakuliah && verifikasiMahasiswa);
        }

        /// <summary>
        /// Method untuk mendapatkan hasil query dari tabel detailPengambilanMatakuliah
        /// </summary>
        /// <param name="dataset">Dataset keluaran yang berisi hasil query</param>
        /// <returns>True ketika sukses meng-query dan sebaliknya.</returns>

        public static bool GetTabel(out DataSet dataset)
        {
            string queryString = string.Format("");
            return SQLHelper.Instance.ExecuteReader(queryString, out dataset);
        }

        /// <summary>
        /// Method untuk mendapatkan hasil query dari tabel detailPengambilanMatakuliah
        /// </summary>
        /// <param name="customQueryString">Kustomisasi query.</param>
        /// <returns>True ketika sukses meng-query dan sebaliknya</returns>
        public static bool GetTABEL(out DataSet dataset, string customQueryString)
        {
            return SQLHelper.Instance.ExecuteReader(customQueryString, out dataset);
        }

        ///<summary>
        ///Method untuk mendapatkan hasil query dari tabel detail pengambilan matakuliah
        ///</summary>
        ///<param name="dataset">Dataset keluaran yang berisi hasil query.</param>
        ///<returns>True ketika sukses meng-query dan sebaliknya</returns>
        
        public static bool GetTabelPreview(out DataSet dataset)
        {
            string queryString = string.Format("SELECT [detail_pengambilan_matakuliah].{0},[detail_matakuliah].{1},[mahasiswa].{2} FROM {3}, {4}, {5} WHERE [detail_pengambilan_matakuliah].{6} = [detail_matakuliah] AND [detail_matakuliah].{8} = [mahasiswa].{9}",
                DetailPengambilanMatakuliah.ColumnNameIdDetailPengambilanMatakuliah,
                DetailMatakuliah.ColumnNameIdMatakuliah, Mahasiswa.ColumnNameNamaMahasiswa,
                DetailPengambilanMatakuliah.TableName, DetailMatakuliah.TableName,Mahasiswa.TableName,
                DetailPengambilanMatakuliah.ColumnNameIdDetailMatakuliah, DetailMatakuliah.ColumnNameIdDetailMatakuliah,
                DetailPengambilanMatakuliah.ColumnNameIdMahasiswa, Mahasiswa.ColumnNameNamaMahasiswa);

            return SQLHelper.Instance.ExecuteReader(queryString, out dataset);
        }

        ///<summary>
        ///Method untuk mendapatkan id detailPengambilanMatakuliah
        ///</summary>
        ///<returns>string kosong ketika terjadi error atau id detail pengambilan matakuliah baru</returns>
        
        public static string GetID()
        {
            var dataset = new DataSet();
            bool isQueryAccomplished = GetTabel(out dataset);
            if (!isQueryAccomplished) return string.Empty;

            return SQLHelper.Instance.GetID(DetailPengambilanMatakuliah.IdPrefix, DetailPengambilanMatakuliah.IdLength, ref dataset);
        }
    }
}
